/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package manejadores;

import com.akcess.exception.*;
import com.akcess.vo.*;
import com.akcess.impl.*;
import com.akcess.dao.*;
import java.sql.*;
import java.util.*;

/**
 * Esta clase se utiliza para realizar las tareas relacionadas con la gestion de las Solicitudes de Registro de los usuarios,
 * como creacion, cancelado y otras de Solicitudes de Registro.
 * @author Alejandro
 */
public class ManejadorSolicitudRegistro {
    
    private Connection conexion = null;

    /**
     * Este es el constructor de la clase.
     * @param con Recibe como parametro una conexion a la BD.
     */
    public ManejadorSolicitudRegistro(Connection con) {
        this.conexion = con;
    }

    /**
     * Mediante este metodo se realiza la creacion o el agregado de una solicitud de Registro a la BD.
     * @param solicitud Recibe una solicitud, el cual es el nuevo registro.
     * @throws com.akcess.exception.Solicitud_registroException Lanza excepciones del tipo Solicitud_registroException, creada por el DAOGenerator.
     */
    public void CrearSolicitudRegistro(Solicitud_registro solicitud) throws Solicitud_registroException {
        try {
            Solicitud_registroRecordCount RCSol;
            int CantRegistros = 0;
            int id_nuevaSol = 0;
            short id_estado = 3;           
            //Le asigno un id a la nueva solicitud
            Solicitud_registroRecordCountDAOImpl RCDaoSol = new Solicitud_registroRecordCountDAOImpl();
            RCSol = RCDaoSol.getRecordCount(this.conexion);
            CantRegistros = RCSol.getCount();
            id_nuevaSol = CantRegistros + 1;
            solicitud.setId_solic_registro(id_nuevaSol);
            solicitud.setId_estado(id_estado);           
            //Agrego a la base de datos la nueva solicitud
            Solicitud_registroDAOImpl manejadorSolicitud = new Solicitud_registroDAOImpl();
            manejadorSolicitud.insert(solicitud, this.conexion);           

        }  catch (Solicitud_registroException ex) {
            ex.printStackTrace();
        } catch (Solicitud_registroRecordCountException ex) {
            ex.printStackTrace();
        }
    }    

    /**
     * Este metodo nos permite obtener todas las solicitudes de registro existentes en el Sistema para poder listarlos.
     * @return Retorna un arreglo de tipo SolicitudRegistroEstado, que contiene toda la informacion de cada solicitud asi como
     * cierta informacion adicional como el nombre del estado en que se encuentra. 
     * @throws com.akcess.exception.Solicitud_registroException Lanza excepciones del tipo Solicitud_registroException, creada por el DAOGenerator.
     */
    public SolicitudRegistroEstado[] ListarSolicitudesEstado() throws Solicitud_registroException {
        SolicitudRegistroEstado[] lista = null;
        try {
            Solicitud_registroDAOImpl manejadorSol = new Solicitud_registroDAOImpl();
            lista = manejadorSol.SolicitudesNombreEstado(this.conexion);           
        } catch (Solicitud_registroException ex) {
            ex.printStackTrace();
        }
        return lista;

    }
    
    /**
     * Este metodo nos permite obtener todas las solicitudes de registro existentes en el Sistema cuyo estado es "Pendiente", para poder listarlos.
     * @return Retorna un arreglo de tipo SolicitudRegistroEstado, que contiene toda la informacion de cada solicitud asi como
     * cierta informacion adicional como el nombre del estado en que se encuentra.
     * @throws com.akcess.exception.Solicitud_registroException Lanza excepciones del tipo Solicitud_registroException, creada por el DAOGenerator.
     */
    public SolicitudRegistroEstado[] ListarSolicitudesPendientes() throws Solicitud_registroException {
        SolicitudRegistroEstado[] lista = null;
        try {
            Solicitud_registroDAOImpl manejadorSol = new Solicitud_registroDAOImpl();
            lista = manejadorSol.SolicitudesPendientes(this.conexion);           
        } catch (Solicitud_registroException ex) {
            ex.printStackTrace();
        }
        return lista;

    }
    
    /**
     * Este metodo nos permite obtener todas las solicitudes de registro existentes en el Sistema para poder listarlos.
     * @return Retorna un arreglo de tipo SolicitudRegistroEstado, que contiene toda la informacion de cada solicitud.
     * @throws com.akcess.exception.Solicitud_registroException Lanza excepciones del tipo Solicitud_registroException, creada por el DAOGenerator.
     */
    public Solicitud_registro[] listarSolicitudes() throws Solicitud_registroException {
        Solicitud_registro[] lista = null;
        try {
            Solicitud_registroDAOImpl manejadorSol = new Solicitud_registroDAOImpl();
            lista = manejadorSol.findAll(this.conexion);           
        } catch (Solicitud_registroException ex) {
            ex.printStackTrace();
        }
        return lista;

    }

    /**
     * Este metodo es utilizado para "Aceptar" o "Aprobar" una solicitud de Registro, al aceptar dicha solicitud tambien ya se crea 
     * el usuario correspondiente en el Sistema y cuyo Rol es el de un Solicitante.
     * @param idSol Indica la solicitud que sera aceptada.
     * @param id_operador Contiene el id del Operador quien acepta la solicitud, para registrar para el log.
     * @throws com.akcess.exception.Solicitud_registroException Lanza excepciones del tipo Solicitud_registroException, creada por el DAOGenerator.
     * @throws com.akcess.exception.UsuariosException Lanza excepciones del tipo UsuariosException, creada por el DAOGenerator.
     * @throws com.akcess.exception.Usuario_tiene_rolException Lanza excepciones del tipo Usuario_tiene_rolException, creada por el DAOGenerator.
     * @throws java.lang.Exception
     */
    public void AceptarSolicitud(int idSol, int id_operador) throws Solicitud_registroException, UsuariosException, Usuario_tiene_rolException, Exception {
         try {
            //Creo un objeto usuario en base a los datos de la solicitud de registro.
            Solicitud_registroPK solPK = new Solicitud_registroPK(idSol);
            Solicitud_registroDAOImpl solDAO = new Solicitud_registroDAOImpl();
            Solicitud_registro sol = solDAO.findByPrimaryKey(solPK, this.conexion);
            Usuarios usuario = new Usuarios();
            usuario.setNombre(sol.getNombre());
            usuario.setApellido(sol.getApellido());
            usuario.setNombreoperativo(sol.getNombreoperativo());
            usuario.setContrasena(sol.getContrasena());
            usuario.setDireccion(sol.getDireccion());
            usuario.setNrodoc(sol.getNrodoc());
            usuario.setIdtipodoc(sol.getIdtipodoc());
            usuario.setCelular(sol.getCelular());
            usuario.setTelefono(sol.getTelefono());            
            usuario.setFax(sol.getFax()); 
            usuario.setObservacion(sol.getObservacion());
            usuario.setId_operador(id_operador);
           //Creo el rol de solicitante para el nuevo usuario...con la solicitud de registro
            //solo se crean solicitantes.
            RolDAOImpl rolDAO = new RolDAOImpl();
            Rol [] roles = rolDAO.findByNombre("Solicitante", this.conexion);
            Vector rol = new Vector();
            rol.add(roles[0]);
            usuario.setRoles(rol);
            
            //Agrego el usuario mediante el metodo de ManejadorUsuario...
            ManejadorUsuarios manejadorUser = new ManejadorUsuarios(this.conexion);
            manejadorUser.AgregarUsuario(usuario);
            short id_estado = 1;
            sol.setId_estado(id_estado);
            sol.setId_operador(id_operador);
            solDAO.update(solPK, sol, this.conexion);
        
        } catch (Usuario_tiene_rolException ex) {
            ex.printStackTrace();
        } catch (Solicitud_registroException ex) {
            ex.printStackTrace();
        }

       
    }  
    
    /**
     * Este metodo permite obtener una sola solicitud de Registro cuyo id es igual al recibido como parametro.
     * @param idSol Contiene el id de la solicitud que queremos obtener de la BD.
     * @return Un objeto de tipo Solicitud_registro, que contiene toda la informacion de la solicitud.
     * @throws com.akcess.exception.Solicitud_registroException Lanza excepciones del tipo Solicitud_registroException, creada por el DAOGenerator.
     */
    public Solicitud_registro ObtenerSolicitud(int idSol) throws Solicitud_registroException {
        Solicitud_registro solicitud = new Solicitud_registro();
        try{        
        Solicitud_registroDAOImpl ManagerSol = new Solicitud_registroDAOImpl();
        Solicitud_registroPK solicitudPK = new Solicitud_registroPK();
        solicitudPK.setId_solic_registro(idSol);
        solicitud = ManagerSol.findByPrimaryKey(idSol, this.conexion);
         } catch (Solicitud_registroException ex) {
            ex.printStackTrace();
        }
        return solicitud;
    }
    
    /**
     * Este metodo es utilizado para "Rechazar" una solicitud de Registro cualquiera.
     * @param idSol Nos permite identificar la solicitud de registro que sera rechazada.
     * @param id_operador id_operador Contiene el id del Operador quien rechaza la solicitud, para registrar para el log.
     * @throws com.akcess.exception.Solicitud_registroException Lanza excepciones del tipo Solicitud_registroException, creada por el DAOGenerator.
     */
    public void RechazarSolicitud(int idSol, int id_operador) throws Solicitud_registroException {        
        try{        
        Solicitud_registroDAOImpl ManagerSol = new Solicitud_registroDAOImpl();
        Solicitud_registroPK solicitudPK = new Solicitud_registroPK();
        solicitudPK.setId_solic_registro(idSol);
        Solicitud_registro solicitud = ManagerSol.findByPrimaryKey(solicitudPK, this.conexion);
        short estado = 2;//id del estado rechazado...
        solicitud.setId_estado(estado);
        solicitud.setId_operador(id_operador);
        ManagerSol.update(solicitudPK, solicitud, this.conexion);
         } catch (Solicitud_registroException ex) {
            ex.printStackTrace();
        }        
    }
    
}
